#pragma once

#define SYLAR_LIRRLE_ENDIAN 1
#define SYLAR_BIG_ENDIAN 2

#include <byteswap.h>
#include <stdint.h>

//8字节类型的字节序转换
template<class T>
typename std::enable_if<sizeof(T) == sizeof(uint64_t), T>::type
byteswap(T value){
    return (T)bswap_64((uint64_t)value); //该函数交换字节序 大端转小端 小端转大端
}

/**
 * @brief 4字节类型的字节序转化
 */
template<class T>
typename std::enable_if<sizeof(T) == sizeof(uint32_t), T>::type
byteswap(T value) {
    return (T)bswap_32((uint32_t)value);
}

/**
 * @brief 2字节类型的字节序转化
 */
template<class T>
typename std::enable_if<sizeof(T) == sizeof(uint16_t), T>::type
byteswap(T value) {
    return (T)bswap_16((uint16_t)value);
}

//BYTE_ORDER：表示本机器是大端字节序还是小端字节序 BIG_ENDIAN：表示大端字节序
//本虚拟机是小端字节序
#if BYTE_ORDER == BIG_ENDIAN //判断是大端还是小端的机器
#define SYLAR_BYTE_ORDER SYLAR_BIG_ENDIAN
#else
#define SYALR_BYTE_ORDER SYLAR_LIRRLE_ENDIAN
#endif

#if SYLAR_BYTE_ORDER == SYLAR_BIG_ENDIAN //表示大端机器
//只在小端机器上执行byteswap, 在大端机器上什么都不做
template<class T>
T byteswapOnLittleEndian(T t){ //
    return t;
}

//只在大端机器上执行byteswap, 在小端机器上什么都不做
template<class T>
T byteswapOnBigEndian(T t){
    return byteswap(t);
}
#else
//只在小端机器上执行byteswap, 在大端机器上什么都不做
template<class T>
T byteswapOnLittleEndian(T t){ //转换为大端
    return byteswap(t);
}

//只在大端机器上执行byteswap, 在小端机器上什么都不做
template<class T>
T byteswapOnBigEndian(T t){ //什么都不做
    return t;
}


#endif

